package yiran.agift.gui;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import yiran.agift.AGift;
import yiran.agift.lang.LangHelper;
import java.util.ArrayList;
import java.util.List;
public class MailboxGUI {

    private static final int SIZE = 54;

    /**
     * 打开玩家的礼品邮箱界面
     * 此方法从邮箱管理系统中获取玩家的礼品列表，并创建一个库存界面来展示这些礼品
     * 玩家可以通过这个界面查看和领取他们的礼品
     *
     * @param player 要打开礼品邮箱界面的玩家
     */
    public void open(Player player) {
        // 获取玩家邮箱中的礼品ID列表
        List<Integer> giftIds = AGift.getInstance()
                .getMailboxManager()
                .getPlayerMailbox(player.getUniqueId());

        // 日志输出玩家邮箱中的礼品数量
        AGift.getInstance().getLogger().info("玩家 " + player.getName() + " 的邮箱中有 " + giftIds.size() + " 个礼包");

        // 创建一个新的库存界面作为礼品邮箱界面
        Inventory inv = Bukkit.createInventory(player, SIZE, LangHelper.getString("mailbox.title"));

        // 遍历礼品ID列表，并为每个礼品创建一个物品图标，然后放入库存界面中
        for (int i = 0; i < giftIds.size() && i < SIZE - 9; i++) {
            ItemStack giftIcon = createGiftIcon(giftIds.get(i));
            inv.setItem(i, giftIcon);
        }

        // 在库存界面中添加一个“全部领取”按钮
        inv.setItem(SIZE - 5, createClaimAllButton());

        // 在库存界面中添加一个“关闭”按钮
        inv.setItem(SIZE - 1, createCloseButton());

        // 让玩家打开这个礼品邮箱界面
        player.openInventory(inv);
    }

    /**
     * 创建一个代表礼物的图标ItemStack
     *
     * @param giftId 礼物的唯一标识符，用于区分不同的礼物
     * @return 返回一个包含礼物信息的ItemStack对象
     */
    private ItemStack createGiftIcon(int giftId) {
        // 初始化一个ItemStack对象，使用CHEST作为礼物的图标
        ItemStack gift = new ItemStack(Material.CHEST);
        // 获取礼物图标的元数据，用于设置显示名称和附魔效果等
        ItemMeta meta = gift.getItemMeta();
        // 通过礼物ID获取礼物的名称
        String giftName = AGift.getInstance().getGiftManager().getGiftName(giftId);
        // 设置礼物图标的显示名称
        meta.setDisplayName(ChatColor.GOLD + giftName);
        // 初始化一个列表，用于存储礼物图标的附魔效果描述
        List<String> lore = new ArrayList<>();
        // 添加提示玩家点击以领取礼物的信息到附魔效果列表中
        lore.add(ChatColor.GRAY + "点击领取此礼包");
        // 添加礼物的ID信息到附魔效果列表中，以便玩家确认礼物
        lore.add(ChatColor.DARK_GRAY + "ID: " + giftId);
        // 设置礼物图标的附魔效果列表
        meta.setLore(lore);
        // 将设置好的元数据应用回礼物图标
        gift.setItemMeta(meta);
        // 返回设置好的礼物图标ItemStack对象
        return gift;
    }

    /**
     * 创建一个用于一键领取全部资源的按钮
     * <p>
     * 此方法生成一个具有特殊显示名称的钻石物品堆，用作界面中的一键领取全部资源按钮
     * 按钮的材质选择为钻石，象征着重要性和珍贵性，其显示名称设置为绿色的“一键领取全部”，
     * 以吸引玩家注意并清晰指示按钮的功能
     *
     * @return 返回一个配置好的 ItemStack 对象，代表一键领取全部资源的按钮
     */
    private ItemStack createClaimAllButton() {
        // 创建一个钻石材质的物品堆，作为一键领取全部资源的按钮
        ItemStack button = new ItemStack(Material.DIAMOND);
        // 获取并准备修改物品的元数据
        ItemMeta meta = button.getItemMeta();
        // 设置物品显示名称为绿色的“一键领取全部”，以明确按钮功能
        meta.setDisplayName(ChatColor.GREEN + "一键领取全部");
        // 将配置好的元数据应用到按钮物品上
        button.setItemMeta(meta);
        // 返回配置好的按钮物品堆
        return button;
    }

    /**
     * 创建关闭邮箱功能的按钮
     * <p>
     * 此方法生成一个具有关闭邮箱功能的按钮，按钮材质为障碍物（BARRIER），
     * 并在按钮上显示红色的“关闭邮箱”字样
     *
     * @return ItemStack 表示关闭按钮的物品堆
     */
    private ItemStack createCloseButton() {
        // 创建一个材质为BARRIER的物品堆，BARRIER代表障碍物
        ItemStack button = new ItemStack(Material.BARRIER);

        // 获取物品的元数据，以便进一步设置显示名称
        ItemMeta meta = button.getItemMeta();

        // 设置物品显示名称为红色的“关闭邮箱”，使用ChatColor.RED进行着色
        meta.setDisplayName(ChatColor.RED + "关闭邮箱");

        // 将设置好显示名称的元数据应用回物品堆
        button.setItemMeta(meta);

        // 返回设置完成的关闭按钮物品堆
        return button;
    }

}
